home *** CD-ROM | disk | FTP | other *** search
/ Computer Inter@ctive 16 / Computer Interactive cdrom 16 - dic 98.iso / zdnetit / content / CLASSBLD.ZIP / Include / CB_IteratorMulti.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-12-19  |  11.4 KB  |  371 lines

  1. #ifndef CB_ITERATOR_MULTI_H
  2. #define CB_ITERATOR_MULTI_H
  3.  
  4. #ifdef _AFXEXT
  5. #define CB_EXT_CLASS       AFX_CLASS_EXPORT
  6. #else
  7. #define CB_EXT_CLASS
  8. #endif
  9.  
  10. #define ITERATOR_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  11.     class CB_EXT_CLASS NameTo##Iterator\
  12.     {\
  13.     private:\
  14.         ClassTo* _ref##NameTo;\
  15.         ClassTo* _prev##NameTo;\
  16.         ClassTo* _next##NameTo;\
  17.         ClassFrom* _iter##ClassFrom;\
  18.         \
  19.         NameTo##Iterator* _prev;\
  20.         NameTo##Iterator* _next;\
  21.         \
  22.         int (ClassTo::*_method)();\
  23.         \
  24.         static NameTo##Iterator* _first;\
  25.         static NameTo##Iterator* _last;\
  26.         \
  27.     public:\
  28.         NameTo##Iterator(ClassFrom* iter##ClassFrom,\
  29.                          int (ClassTo::*method)() = 0,\
  30.                          ClassTo* ref##NameTo = 0);\
  31.         NameTo##Iterator(ClassFrom& iter##ClassFrom,\
  32.                          int (ClassTo::*method)() = 0,\
  33.                          ClassTo* ref##NameTo = 0);\
  34.         NameTo##Iterator(const NameTo##Iterator& iterator,\
  35.                          int (ClassTo::*method)() = 0);\
  36.         ~NameTo##Iterator();\
  37.         \
  38.         NameTo##Iterator& operator= (const NameTo##Iterator& iterator)\
  39.         {\
  40.             _iter##ClassFrom = iterator._iter##ClassFrom;\
  41.             _ref##NameTo = iterator._ref##NameTo;\
  42.             _prev##NameTo = iterator._prev##NameTo;\
  43.             _next##NameTo = iterator._next##NameTo;\
  44.             _method = iterator._method;\
  45.             return *this;\
  46.         }\
  47.         ClassTo* operator++ ()\
  48.         {\
  49.             _next##NameTo = _iter##ClassFrom->GetNext##NameTo(_next##NameTo);\
  50.             if (_method != 0)\
  51.             {\
  52.                 while (_next##NameTo && !(_next##NameTo->*_method)())\
  53.                     _next##NameTo = _iter##ClassFrom->GetNext##NameTo(_next##NameTo);\
  54.             }\
  55.             _ref##NameTo = _prev##NameTo = _next##NameTo;\
  56.             return _ref##NameTo;\
  57.         }\
  58.         ClassTo* operator-- ()\
  59.         {\
  60.             _prev##NameTo = _iter##ClassFrom->GetPrev##NameTo(_prev##NameTo);\
  61.             if (_method != 0)\
  62.             {\
  63.                 while (_prev##NameTo && !(_prev##NameTo->*_method)())\
  64.                     _prev##NameTo = _iter##ClassFrom->GetPrev##NameTo(_prev##NameTo);\
  65.             }\
  66.             _ref##NameTo = _next##NameTo = _prev##NameTo;\
  67.             return _ref##NameTo;\
  68.         }\
  69.         operator ClassTo*() { return _ref##NameTo; }\
  70.         ClassTo* operator-> () { return _ref##NameTo; }\
  71.         void Reset() { _ref##NameTo = _prev##NameTo = _next##NameTo = (ClassTo*)0; }\
  72.         \
  73.         int IsLast() { return (_iter##ClassFrom->GetLast##NameTo() == _ref##NameTo); }\
  74.         int IsFirst() { return (_iter##ClassFrom->GetFirst##NameTo() == _ref##NameTo); }\
  75.         \
  76.         static void Check(ClassTo* item##NameTo);\
  77.         static void Check(ClassTo* item##NameTo, ClassTo* newItem##NameTo);\
  78.     };
  79.  
  80. #define METHODS_ITERATOR_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  81.     ClassFrom##::##NameTo##Iterator* ClassFrom##::##NameTo##Iterator::_first = 0;\
  82.     ClassFrom##::##NameTo##Iterator* ClassFrom##::##NameTo##Iterator::_last = 0;\
  83.     \
  84.     ClassFrom##::##NameTo##Iterator::NameTo##Iterator(\
  85.         ClassFrom* iter##ClassFrom,\
  86.         int (ClassTo::*method)(),\
  87.         ClassTo* ref##NameTo)\
  88.     {\
  89.         assert(iter##ClassFrom);\
  90.     \
  91.         _iter##ClassFrom = iter##ClassFrom;\
  92.         _ref##NameTo = _prev##NameTo = _next##NameTo = ref##NameTo;\
  93.         _prev = (NameTo##Iterator*)0;\
  94.         _next = (NameTo##Iterator*)0;\
  95.         _method = method;\
  96.         if (_last)\
  97.         {\
  98.             _last->_next = this;\
  99.             _prev = _last;\
  100.             _last = this;\
  101.         }\
  102.         else\
  103.             _first = _last = this;\
  104.     }\
  105.     \
  106.     ClassFrom##::##NameTo##Iterator::NameTo##Iterator(\
  107.         ClassFrom& iter##ClassFrom,\
  108.         int (ClassTo::*method)(),\
  109.         ClassTo* ref##NameTo)\
  110.     {\
  111.         assert(&iter##ClassFrom);\
  112.     \
  113.         _iter##ClassFrom = &iter##ClassFrom;\
  114.         _ref##NameTo = _prev##NameTo = _next##NameTo = ref##NameTo;\
  115.         _prev = (NameTo##Iterator*)0;\
  116.         _next = (NameTo##Iterator*)0;\
  117.         _method = method;\
  118.         if (_last)\
  119.         {\
  120.             _last->_next = this;\
  121.             _prev = _last;\
  122.             _last = this;\
  123.         }\
  124.         else\
  125.             _first = _last = this;\
  126.     }\
  127.     \
  128.     ClassFrom##::##NameTo##Iterator::NameTo##Iterator(\
  129.         const NameTo##Iterator& iterator,\
  130.         int (ClassTo::*method)())\
  131.     {\
  132.         _iter##ClassFrom = iterator._iter##ClassFrom;\
  133.         _ref##NameTo = iterator._ref##NameTo;\
  134.         _prev##NameTo = iterator._prev##NameTo;\
  135.         _next##NameTo = iterator._next##NameTo;\
  136.         _prev = (NameTo##Iterator*)0;\
  137.         _next = (NameTo##Iterator*)0;\
  138.         _method = method;\
  139.         if (_last)\
  140.         {\
  141.             _last->_next = this;\
  142.             _prev = _last;\
  143.             _last = this;\
  144.         }\
  145.         else\
  146.             _first = _last = this;\
  147.     }\
  148.     \
  149.     ClassFrom##::##NameTo##Iterator::~NameTo##Iterator()\
  150.     {\
  151.         if (_next)\
  152.             _next->_prev = _prev;\
  153.         else\
  154.             _last = _prev;\
  155.     \
  156.         if (_prev)\
  157.             _prev->_next = _next;\
  158.         else\
  159.             _first = _next;\
  160.     }\
  161.     \
  162.     void ClassFrom##::##NameTo##Iterator::Check(ClassTo* item##NameTo)\
  163.     {\
  164.         for (NameTo##Iterator* item = _first; item; item = item->_next)\
  165.         {\
  166.             if (item->_prev##NameTo == item##NameTo)\
  167.             {\
  168.                 item->_prev##NameTo = item->_iter##ClassFrom->GetNext##NameTo(item->_prev##NameTo);\
  169.                 item->_ref##NameTo = 0;\
  170.             }\
  171.             if (item->_next##NameTo == item##NameTo)\
  172.             {\
  173.                 item->_next##NameTo = item->_iter##ClassFrom->GetPrev##NameTo(item->_next##NameTo);\
  174.                 item->_ref##NameTo = 0;\
  175.             }\
  176.         }\
  177.     }\
  178.     \
  179.     void ClassFrom##::##NameTo##Iterator::Check(ClassTo* item##NameTo, ClassTo* newItem##NameTo)\
  180.     {\
  181.         for (NameTo##Iterator* item = _first; item; item = item->_next)\
  182.         {\
  183.             if (item->_ref##NameTo == item##NameTo)\
  184.             {\
  185.                 item->_ref##NameTo = item->_prev##NameTo = item->_next##NameTo = newItem##NameTo;\
  186.             }\
  187.             if (item->_prev##NameTo == item##NameTo)\
  188.             {\
  189.                 item->_prev##NameTo = newItem##NameTo;\
  190.                 item->_ref##NameTo = 0;\
  191.             }\
  192.             if (item->_next##NameTo == item##NameTo)\
  193.             {\
  194.                 item->_next##NameTo = newItem##NameTo;\
  195.                 item->_ref##NameTo = 0;\
  196.             }\
  197.         }\
  198.     }
  199.  
  200. #define ITERATOR_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  201.     class CB_EXT_CLASS NameTo##Iterator\
  202.     {\
  203.     private:\
  204.         ClassTo* _ref##NameTo;\
  205.         ClassTo* _prev##NameTo;\
  206.         ClassTo* _next##NameTo;\
  207.         ClassFrom* _iter##ClassFrom;\
  208.         \
  209.         NameTo##Iterator* _prev;\
  210.         NameTo##Iterator* _next;\
  211.         \
  212.         static NameTo##Iterator* _first;\
  213.         static NameTo##Iterator* _last;\
  214.         \
  215.     public:\
  216.         NameTo##Iterator(ClassFrom* iter##ClassFrom,\
  217.                          ClassTo* ref##NameTo = 0);\
  218.         NameTo##Iterator(ClassFrom& iter##ClassFrom,\
  219.                          ClassTo* ref##NameTo = 0);\
  220.         NameTo##Iterator(const NameTo##Iterator& iterator);\
  221.         ~NameTo##Iterator();\
  222.         \
  223.         NameTo##Iterator& operator= (const NameTo##Iterator& iterator)\
  224.         {\
  225.             _iter##ClassFrom = iterator._iter##ClassFrom;\
  226.             _ref##NameTo = iterator._ref##NameTo;\
  227.             _prev##NameTo = iterator._prev##NameTo;\
  228.             _next##NameTo = iterator._next##NameTo;\
  229.             return *this;\
  230.         }\
  231.         ClassTo* operator++ ()\
  232.         {\
  233.             _next##NameTo = _iter##ClassFrom->GetNext##NameTo(_next##NameTo);\
  234.             _ref##NameTo = _prev##NameTo = _next##NameTo;\
  235.             return _ref##NameTo;\
  236.         }\
  237.         ClassTo* operator-- ()\
  238.         {\
  239.             _prev##NameTo = _iter##ClassFrom->GetPrev##NameTo(_prev##NameTo);\
  240.             _ref##NameTo = _next##NameTo = _prev##NameTo;\
  241.             return _ref##NameTo;\
  242.         }\
  243.         operator ClassTo*() { return _ref##NameTo; }\
  244.         ClassTo* operator-> () { return _ref##NameTo; }\
  245.         void Reset() { _ref##NameTo = _prev##NameTo = _next##NameTo = (ClassTo*)0; }\
  246.         \
  247.         int IsLast() { return (_iter##ClassFrom->GetLast##NameTo() == _ref##NameTo); }\
  248.         int IsFirst() { return (_iter##ClassFrom->GetFirst##NameTo() == _ref##NameTo); }\
  249.         \
  250.         static void Check(ClassTo* item##NameTo);\
  251.         static void Check(ClassTo* item##NameTo, ClassTo* newItem##NameTo);\
  252.     };
  253.  
  254. #define METHODS_ITERATOR_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  255.     ClassFrom##::##NameTo##Iterator* ClassFrom##::##NameTo##Iterator::_first = 0;\
  256.     ClassFrom##::##NameTo##Iterator* ClassFrom##::##NameTo##Iterator::_last = 0;\
  257.     \
  258.     ClassFrom##::##NameTo##Iterator::NameTo##Iterator(\
  259.         ClassFrom* iter##ClassFrom, ClassTo* ref##NameTo)\
  260.     {\
  261.         assert(iter##ClassFrom);\
  262.     \
  263.         _iter##ClassFrom = iter##ClassFrom;\
  264.         _ref##NameTo = _prev##NameTo = _next##NameTo = ref##NameTo;\
  265.         _prev = (NameTo##Iterator*)0;\
  266.         _next = (NameTo##Iterator*)0;\
  267.         if (_last)\
  268.         {\
  269.             _last->_next = this;\
  270.             _prev = _last;\
  271.             _last = this;\
  272.         }\
  273.         else\
  274.             _first = _last = this;\
  275.     }\
  276.     \
  277.     ClassFrom##::##NameTo##Iterator::NameTo##Iterator(\
  278.         ClassFrom& iter##ClassFrom, ClassTo* ref##NameTo)\
  279.     {\
  280.         assert(&iter##ClassFrom);\
  281.     \
  282.         _iter##ClassFrom = &iter##ClassFrom;\
  283.         _ref##NameTo = _prev##NameTo = _next##NameTo = ref##NameTo;\
  284.         _prev = (NameTo##Iterator*)0;\
  285.         _next = (NameTo##Iterator*)0;\
  286.         if (_last)\
  287.         {\
  288.             _last->_next = this;\
  289.             _prev = _last;\
  290.             _last = this;\
  291.         }\
  292.         else\
  293.             _first = _last = this;\
  294.     }\
  295.     \
  296.     ClassFrom##::##NameTo##Iterator::NameTo##Iterator(\
  297.         const NameTo##Iterator& iterator)\
  298.     {\
  299.         _iter##ClassFrom = iterator._iter##ClassFrom;\
  300.         _ref##NameTo = iterator._ref##NameTo;\
  301.         _prev##NameTo = iterator._prev##NameTo;\
  302.         _next##NameTo = iterator._next##NameTo;\
  303.         _prev = (NameTo##Iterator*)0;\
  304.         _next = (NameTo##Iterator*)0;\
  305.         if (_last)\
  306.         {\
  307.             _last->_next = this;\
  308.             _prev = _last;\
  309.             _last = this;\
  310.         }\
  311.         else\
  312.             _first = _last = this;\
  313.     }\
  314.     \
  315.     ClassFrom##::##NameTo##Iterator::~NameTo##Iterator()\
  316.     {\
  317.         if (_next)\
  318.             _next->_prev = _prev;\
  319.         else\
  320.             _last = _prev;\
  321.     \
  322.         if (_prev)\
  323.             _prev->_next = _next;\
  324.         else\
  325.             _first = _next;\
  326.     }\
  327.     \
  328.     void ClassFrom##::##NameTo##Iterator::Check(ClassTo* item##NameTo)\
  329.     {\
  330.         for (NameTo##Iterator* item = _first; item; item = item->_next)\
  331.         {\
  332.             if (item->_prev##NameTo == item##NameTo)\
  333.             {\
  334.                 item->_prev##NameTo = item->_iter##ClassFrom->GetNext##NameTo(item->_prev##NameTo);\
  335.                 item->_ref##NameTo = 0;\
  336.             }\
  337.             if (item->_next##NameTo == item##NameTo)\
  338.             {\
  339.                 item->_next##NameTo = item->_iter##ClassFrom->GetPrev##NameTo(item->_next##NameTo);\
  340.                 item->_ref##NameTo = 0;\
  341.             }\
  342.         }\
  343.     }\
  344.     \
  345.     void ClassFrom##::##NameTo##Iterator::Check(ClassTo* item##NameTo, ClassTo* newItem##NameTo)\
  346.     {\
  347.         for (NameTo##Iterator* item = _first; item; item = item->_next)\
  348.         {\
  349.             if (item->_ref##NameTo == item##NameTo)\
  350.             {\
  351.                 item->_ref##NameTo = item->_prev##NameTo = item->_next##NameTo = newItem##NameTo;\
  352.             }\
  353.             if (item->_prev##NameTo == item##NameTo)\
  354.             {\
  355.                 item->_prev##NameTo = newItem##NameTo;\
  356.                 item->_ref##NameTo = 0;\
  357.             }\
  358.             if (item->_next##NameTo == item##NameTo)\
  359.             {\
  360.                 item->_next##NameTo = newItem##NameTo;\
  361.                 item->_ref##NameTo = 0;\
  362.             }\
  363.         }\
  364.     }
  365.  
  366. #define METHODS_ITERATOR_BINARYBITTREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  367.         METHODS_ITERATOR_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  368.  
  369. #define METHODS_ITERATOR_NOFILTER_BINARYBITTREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  370.         METHODS_ITERATOR_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  371. #endif